package me.yricky.alia

import androidx.compose.ui.geometry.Offset
import me.yricky.alia.data.hierarchy.Library
import me.yricky.alia.utils.gds.convert2Lib
import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.annotations.Benchmark
import org.openjdk.jmh.runner.Runner
import org.openjdk.jmh.runner.options.Options
import org.openjdk.jmh.runner.options.OptionsBuilder
import java.io.File

/**
 * @author Yricky
 * @date 2022/1/31
 */
@BenchmarkMode(Mode.Throughput)
@Warmup(time = 1, iterations = 5)
@Measurement(time = 3, iterations = 5)
@Fork(1)
@State(Scope.Benchmark)
open class Benchmark {
    val lib:Library = convert2Lib(File("../asap7sc6t_26_SRAM.gds").inputStream())
    val cell = lib.cells[0]


//    @Benchmark
//    fun testList1(){
//        val list = ArrayList<String>()
//        (0 .. 20).forEach{
//            list.add("${it}")
//        }
//    }

//    @Benchmark
//    fun testList2(){
//        var list = listOf<String>()
//        (0 .. 20).forEach{
//            list = list.plus("${it}")
//        }
//    }

//    @Benchmark
//    fun testShapeContains(){
//
//    }
    data class FCoord(
    val x:Float,
    val y:Float,
    )

    @Benchmark
    fun testOffset():Float{
        val a = Offset(1f,1f)
        return a.x * a.y
    }

    @Benchmark
    fun testFCoord():Float{
        val a = FCoord(1f,1f)
        return a.x * a.y
    }


//    @Benchmark
//    fun testBBox():List<Box>{
//        return lib.cells.map { it.bBox }
//    }
}

fun main(){
    val opt: Options = OptionsBuilder()
        .include(Benchmark::class.java.simpleName) //benchmark 所在的类的名字，注意这里是使用正则表达式对所有类进行匹配的
        .forks(1) //进行 fork 的次数。如果 fork 数是2的话，则 JMH 会 fork 出两个进程来进行测试
        .build()
    Runner(opt).run()
}